angular.module('image-saver', [])
    .directive('imageSaver', function (FileService, $cordovaNetwork,$timeout,$compile) {
        function link(scope, element, attr) {

            //var fileName = attr.name.split('//').pop().split('/').pop();
            //获取文件名称，所以为了唯一性，建议后台开发的文件名称可以以md5为文件名，这样就确保不会重复
            var fileName = attr.name.split('/').pop();

            //在线状况的处理
            if ($cordovaNetwork.isOnline()) {
                 // 可以加一个div对象显示loading，也可以将element进行样式修改以表示加载中，目前采用的是样式处理
                 //element.css('background', 'gray');
                 element.attr('src', 'img/loading.png');

                 // var loader = $compile('<ion-spinner icon="android"></ion-spinner>')(scope);
                 // element.after(loader);
                 // element.css("display","none");

                FileService.CheckThenDownloadFile(attr.name, fileName, attr.directory)
                    .then(function (res) {
                        // 配合加入的div进行移除操作的内容
                        // loader.remove();
                        // element.css("display","block");

                        element.attr('src', res);
                        
                        $timeout(function () {
                            scope.$apply()
                        });
                    }, function (err) {
                        //error
                    })
            }else{
            //离线状况的处理
                FileService.getOfflineData(fileName, attr.directory).then(function (res) {
                    element.attr('src',res);
                    $timeout(function () {
                        scope.$apply()
                    })
                })
            }
        }
        return {
            restrict: 'A',
            scope: {
                name: '@',
                directory: '@'
            },
            link: link

        }
    })

    .factory('FileService', function ($q, $cordovaFile, $cordovaFileTransfer,$timeout) {
           var StorageDirectory = cordova.file.cacheDirectory;
           function DownloadFileAsync(url,StorageDirectory,directory,file,options,AllowAllHost){
               var q = $q.defer();
               //利用download方法进行下载，目前还没有进度Loading的显示，需要进行完善
               //完善思路是在element对象前创建一个对象，然后利用progress变量，将进度信息写入到element前面对象的内容里，在success成功下载的时候，则删除那个对象
               $cordovaFileTransfer.download(url,StorageDirectory+directory+'/'+file,options,AllowAllHost)
               .then(function () {
                   var path = StorageDirectory+directory+'/'+file;
                   
                

                   q.resolve(path)
               }, function (err) {
                   q.reject(err);
               }, function (progress) {
                $timeout(function () {

                  //console.log((progress.loaded / progress.total) * 100 )
                })
              },false);
              return q.promise
           }
           return {
                CheckThenDownloadFile: function (url, file, directory) {

                    var q = $q.defer();
                    //检查目录是否存在
                    $cordovaFile.checkDir(cordova.file.cacheDirectory, directory).then(function () {
                        //检查文件是否存在，存在就返回path变量
                         $cordovaFile.checkFile(StorageDirectory+directory+'/',file).then(function () {
                            var path  = StorageDirectory+directory+'/'+file;
                            q.resolve(path)
                         }, function () {
                             //不存在则进行下载文件操作
                             var options = {create : true, exclusive: false};

                             DownloadFileAsync(url,StorageDirectory,directory,file,options,true).then(function (res) {
                                q.resolve(res); //返回下载的本地路径内容
                             }, function (err) {
                                //下载出错
                                 q.reject(err)
                             })
                         })
                    }, function () { 
                        //不存在则创建目录
                        var options = {create : true, exclusive: false};
                        $cordovaFile.createDir(StorageDirectory,directory,true).then(function () {
                            //并且下载文件返回路径
                            DownloadFileAsync(url,StorageDirectory,directory,file,options,true).then(function (res) {
                                q.resolve(res)
                            }, function () {
                                q.reject()
                            })
                        })
                    });
                    return q.promise
                },
                //获取离线文件
                getOfflineData: function (file, directory) {
                    var q = $q.defer();
                    // 检查目录是否存在
                    $cordovaFile.checkDir(StorageDirectory, directory).then(function () {
                        //检查文件是否存在
                        $cordovaFile.checkFile(StorageDirectory+directory+'/', file).then(function () {
                            var path = StorageDirectory+directory+'/'+file;
                            q.resolve(path)
                        }, function (err) {
                            q.reject(err)
                        })
                    }, function (err) {
                        q.reject(err)
                    });
                    return q.promise
                }
           }
    });
